"""
    该文件的主要作用是分析由predict.py文件产生的数据的关联，并可视化
"""
import pandas as pd
from utils.painter import draw_line
import matplotlib.pyplot as plt
import numpy as np
import csv


def get_hidden_distance():
    # 导入输入图像的潜空间
    h1_rx = pd.read_csv('data/pre_result/对于x角度上的噪声/statistical_result/hidden1.csv').values
    h1_ry = pd.read_csv('data/pre_result/对于y角度上的噪声/statistical_result/hidden1.csv').values
    h1_rz = pd.read_csv('data/pre_result/对于z角度上的噪声/statistical_result/hidden1.csv').values
    h1_tx = pd.read_csv('data/pre_result/对于x位移上的噪声/statistical_result/hidden1.csv').values
    h1_ty = pd.read_csv('data/pre_result/对于y位移上的噪声/statistical_result/hidden1.csv').values
    h1_tz = pd.read_csv('data/pre_result/对于z位移上的噪声/statistical_result/hidden1.csv').values
    # 导入预测图像的潜空间
    h2_rx = pd.read_csv('data/pre_result/对于x角度上的噪声/statistical_result/hidden2.csv').values
    h2_ry = pd.read_csv('data/pre_result/对于y角度上的噪声/statistical_result/hidden2.csv').values
    h2_rz = pd.read_csv('data/pre_result/对于z角度上的噪声/statistical_result/hidden2.csv').values
    h2_tx = pd.read_csv('data/pre_result/对于x位移上的噪声/statistical_result/hidden2.csv').values
    h2_ty = pd.read_csv('data/pre_result/对于y位移上的噪声/statistical_result/hidden2.csv').values
    h2_tz = pd.read_csv('data/pre_result/对于z位移上的噪声/statistical_result/hidden2.csv').values
    hd_rx = np.linalg.norm(h1_rx - h2_rx, axis=1)
    hd_ry = np.linalg.norm(h1_ry - h2_ry, axis=1)
    hd_rz = np.linalg.norm(h1_rz - h2_rz, axis=1)
    hd_tx = np.linalg.norm(h1_tx - h2_tx, axis=1)
    hd_ty = np.linalg.norm(h1_ty - h2_ty, axis=1)
    hd_tz = np.linalg.norm(h1_tz - h2_tz, axis=1)
    h_margin = pd.DataFrame(columns=['hd_rx', 'hd_ry', 'hd_rz', 'hd_tx', 'hd_ty', 'hd_tz'])
    h_margin['hd_rx'] = hd_rx
    h_margin['hd_ry'] = hd_ry
    h_margin['hd_rz'] = hd_rz
    h_margin['hd_tx'] = hd_tx
    h_margin['hd_ty'] = hd_ty
    h_margin['hd_tz'] = hd_tz
    return h_margin


if __name__ == "__main__":
    # 记录单维度噪声下，不同噪声和预测参数之间的MPD
    # 导入数据
    tru_rx = pd.read_csv('data/pre_result/对于x角度上的噪声/statistical_result/tru.csv')
    tru_ry = pd.read_csv('data/pre_result/对于y角度上的噪声/statistical_result/tru.csv')
    tru_rz = pd.read_csv('data/pre_result/对于z角度上的噪声/statistical_result/tru.csv')
    tru_tx = pd.read_csv('data/pre_result/对于x位移上的噪声/statistical_result/tru.csv')
    tru_ty = pd.read_csv('data/pre_result/对于y位移上的噪声/statistical_result/tru.csv')
    tru_tz = pd.read_csv('data/pre_result/对于z位移上的噪声/statistical_result/tru.csv')
    # 导入预测数据
    pre_rx = pd.read_csv('data/pre_result/对于x角度上的噪声/statistical_result/pre.csv')
    pre_ry = pd.read_csv('data/pre_result/对于y角度上的噪声/statistical_result/pre.csv')
    pre_rz = pd.read_csv('data/pre_result/对于z角度上的噪声/statistical_result/pre.csv')
    pre_tx = pd.read_csv('data/pre_result/对于x位移上的噪声/statistical_result/pre.csv')
    pre_ty = pd.read_csv('data/pre_result/对于y位移上的噪声/statistical_result/pre.csv')
    pre_tz = pd.read_csv('data/pre_result/对于z位移上的噪声/statistical_result/pre.csv')
    # 导入对应MPD
    MPD_rx = pd.read_csv('data/pre_result/对于x角度上的噪声/statistical_result/MPD.csv', header=None).iloc[0]
    MPD_ry = pd.read_csv('data/pre_result/对于y角度上的噪声/statistical_result/MPD.csv', header=None).iloc[0]
    MPD_rz = pd.read_csv('data/pre_result/对于z角度上的噪声/statistical_result/MPD.csv', header=None).iloc[0]
    MPD_tx = pd.read_csv('data/pre_result/对于x位移上的噪声/statistical_result/MPD.csv', header=None).iloc[0]
    MPD_ty = pd.read_csv('data/pre_result/对于y位移上的噪声/statistical_result/MPD.csv', header=None).iloc[0]
    MPD_tz = pd.read_csv('data/pre_result/对于z位移上的噪声/statistical_result/MPD.csv', header=None).iloc[0]
    # 得到原始图像和预测图像在卷积层潜空间的距离
    HD = get_hidden_distance()
    # 得到横坐标并归一化
    delta_rx = tru_rx['tru_rx'] / 15
    delta_ry = (tru_ry['tru_ry'] - 270) / 5
    delta_rz = (tru_rz['tru_rz'] - 90) / 5
    delta_tx = tru_tx['tru_tx'] / 50
    delta_ty = tru_ty['tru_ty'] / 50
    delta_tz = tru_tz['tru_tz'] / 50
    # 绘制折线图
    # 记录每张图片的id
    test_id = pd.DataFrame({"id": [i for i in range(100)]})
    # 将两个series拼接并排序
    rx = pd.concat([delta_rx, pre_rx['pre_rx']/15, MPD_rx, HD["hd_rx"], test_id['id']], axis=1)
    sorted_rx = rx.sort_values("tru_rx").round(2)
    ry = pd.concat([delta_ry, (pre_ry['pre_ry']-270)/5, MPD_ry, HD["hd_ry"], test_id['id']], axis=1)
    sorted_ry = ry.sort_values("tru_ry").round(2)
    rz = pd.concat([delta_rz, (pre_rz['pre_rz']-90)/5, MPD_rz, HD["hd_rz"], test_id['id']], axis=1)
    sorted_rz = rz.sort_values("tru_rz").round(2)
    tx = pd.concat([delta_tx, pre_tx['pre_tx']/50, MPD_tx, HD["hd_tx"], test_id['id']], axis=1)
    sorted_tx = tx.sort_values("tru_tx").round(2)
    ty = pd.concat([delta_ty, pre_ty['pre_ty']/50, MPD_ty, HD["hd_ty"], test_id['id']], axis=1)
    sorted_ty = ty.sort_values("tru_ty").round(2)
    tz = pd.concat([delta_tz, pre_tz['pre_tz']/50, MPD_tz, HD["hd_tz"], test_id['id']], axis=1)
    sorted_tz = tz.sort_values("tru_tz").round(2)
    # 归纳成相应的横纵坐标
    x_data = [sorted_rx['tru_rx'], sorted_ry['tru_ry'], sorted_rz['tru_rz'],
              sorted_tx['tru_tx'], sorted_ty['tru_ty'], sorted_tz['tru_tz']]
    y1_data = [sorted_rx[0], sorted_ry[0], sorted_rz[0], sorted_tx[0], sorted_ty[0], sorted_tz[0]]
    # print(sorted_rx[0])
    # for m in range(6):
    # plt.scatter(x_data, y_data)
    # plt.show()
    # plt.close()
    y1_label = ['绕自身z轴', '绕自身y轴', '绕固定z轴', '沿自身x轴', '沿自身y轴', '沿自身z轴']
    draw_line(x_data, y1_data, y1_label, 'data/analyse_result/MPD_error.html',
              'MPD_error', mode='multi_x_axis', title='MPD误差')
    # 绘制每个方向的变化和对应的潜空间距离差值
    y2_data = [sorted_rx['hd_rx'], sorted_ry['hd_ry'], sorted_rz['hd_rz'],
               sorted_tx['hd_tx'], sorted_ty['hd_ty'], sorted_tz['hd_tz']]
    # 记录每张图片的id
    y3_data = [sorted_rx['id'], sorted_ry['id'], sorted_rz['id'],
               sorted_tx['id'], sorted_ty['id'], sorted_tz['id']]
    # 绘制每个方向对应维度预测和真值的差
    y4_data = [sorted_rx['pre_rx'], sorted_ry['pre_ry'], sorted_rz['pre_rz'],
               sorted_tx['pre_tx'], sorted_ty['pre_ty'], sorted_tz['pre_tz']]
    #
    saving_prefix = ['HD_rx', 'HD_ry', 'HD_rz',
                     'HD_tx', 'HD_ty', 'HD_tz']
    for i in range(6):
        draw_line(x_data[i], [y1_data[i], y2_data[i], y3_data[i]/100, round(abs(y4_data[i]-x_data[i]), 3)],
                  [y1_label[i], 'HD', 'id', 'pre_error'],
                  'data/analyse_result/{}.html'.format(saving_prefix[i]), saving_prefix[i],
                  mode='one_x_axis', title=saving_prefix[i])
    # 将对应的数据保存
    rx.to_csv("data/analyse_result/csv/rx_result.csv")
    ry.to_csv("data/analyse_result/csv/ry_result.csv")
    rz.to_csv("data/analyse_result/csv/rz_result.csv")
    tx.to_csv("data/analyse_result/csv/tx_result.csv")
    ty.to_csv("data/analyse_result/csv/ty_result.csv")
    tz.to_csv("data/analyse_result/csv/tz_result.csv")


